var app = getApp();
var appConf = app.config;

function formatTime(date) {
  var year = date.getFullYear()
  var month = date.getMonth() + 1
  var day = date.getDate()

  var hour = date.getHours()
  var minute = date.getMinutes()
  var second = date.getSeconds()


  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}

function isSet(value) {
  if(typeof(value) == 'undefined' || value == null) {
    return false;
  }
  return true;
}

function isEmpty(value) {
  if(!isSet(value) || value == '' || value == 0) {
    return true;
  }
  return false;
}

function isString(value) {
  if(!isEmpty(value) && Object.prototype.toString.call(value) === '[object String]') {
    return true;
  }
  return false;
}

/**
 * 判断字符创是否为json字符串
 */

function isJson(value) {
  if(isString(value)) {
    try {
      var result = JSON.parse(value);
      if(typeof(result) == 'object') {
        return result;
      }
      return false;
    }
    catch(err) {
      return false;
    }
  }
  return false;
}

function formatNumber(n) {
  n = n.toString()
  return n[1] ? n : '0' + n
}

/**
 * 新建随机字符串函数
 */

function createRandomStr(strlen) {
  
  //存储结果的字符串
  var randomStr = '';

  //用于生成随机字符串的素材
  var material = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';

  //循环生成长度
  for(var i = 0;i < strlen;i++) {

    //添加在素材字符串随机找到的字符
    randomStr += material[parseInt(Math.random() * 61)];
  }

  //返回生成的随机字符串
  return randomStr;
}

/**
 * 调试日志函数，当开启debug时将会输出日志
 */

function debugLog(content) {
  if(appConf.debug) {
    console.log(content);
  }
}

/**
 * 错误输出函数
 */

function showError(errorTitle, errorMsg, errorCode) {

  //是否处于重连状态
  if(status('retryConnect')) {
    return;
  }

  //默认错误码为为0
  errorCode = errorCode || 0;
  console.log('发生错误[' + errorCode + ']' + errorMsg);
  //弹出错误内容框
  wx.showModal({
    title: errorTitle,
    content: '[' + errorCode + ']' + errorMsg + '，请重试',
  });
  
}

/**
 * 获取字符串中包含的所有关键字的位置数组
 */

function getStrKeyWordArray(str, keyWord, wordIndex, keyWordArray) {
  wordIndex = str.indexOf(keyWord, wordIndex);
  if(wordIndex == -1) {
    return keyWordArray;
  }
  var strChunk = str.substr(wordIndex, keyWord.length);
  keyWordArray.push({
    word: strChunk,
    index: wordIndex
  });
  wordIndex += keyWord.length;
  return getStrKeyWordArray(str, keyWord, wordIndex, keyWordArray);
}

/**
 * 检查请求返回的的值是否为报错内容函数
 */

function checkSuccess(result, allowCode) {
  //取得data
  result = result.errCode ? result : result.data;
  //判断错误码是否为为0
  if(result.errCode == 0) {
    //返回正确
    return true;
  }
  else {
    //错误码白名单检查（有部分错误码希望捕获而不希望返回错误）
    for(var codeIndex in allowCode) {
      if(allowCode[codeIndex] == result.errCode) {
        //返回正确
        return true;
      }
    }
  }
  //返回错误
  return false;
}

/**
 * 获取配置函数
 */

function config(configName) {
  return appConf[configName] ? appConf[configName] : null;
}

/**
 * 设置或获取公共状态函数
 */

function status(statusName, statusVal) {
  if(isSet(statusVal)) {
    app.status[statusName] = statusVal;
  }
  return app.status[statusName] ? app.status[statusName] : null;
}

/**
 * 清除公共状态函数
 */

function clearStatus() {
    app.status = [];
}

/**
 * 设置或获取公共数据函数
 */

function globalData(key, val) {
  if(val) {
    app.globalData[key] = val;
  }
  return app.globalData[key] ? app.globalData[key] : null;
}

/**
 * 清除公共数据函数
 */

function clearGlobalData() {
    app.globalData = [];
}

/**
 * 切换页面函数
 */

function changePage(pageName, pageParams) {
  pageParams = pageParams || {};
  var paramsStr = '?';
  for(var key in pageParams) {
    paramsStr += (key + '=' + pageParams[key]) + '&';
  }
  wx.navigateTo({
    url: '../../pages/' + pageName + '/' + pageName + paramsStr,
    fail: function(err) {
      console.log(err);
      showError('切换页面失败', '切换到' + pageName + '页面失败');
    }
  });
}

function encodeURIObj(obj) {
  var newObj = {};
  for(var objKey in obj) {
    newObj[objKey] = encodeURI(obj[objKey]);
  }
  return newObj;
}

function showLoading(title) {
  if(wx.showLoading) {
    wx.showLoading({
      title: title,
      mask: true
    });
  }
  else {
    wx.showToast({
      title: title,
      icon: 'loading',
      mask: true,
      duration: 10000
    });
  }
}

function hideLoading() {
  if(wx.hideLoading) {
    wx.hideLoading();
  }
  else {
    wx.hideToast();
  }
}

function add(a, b) {
  let c, d, e, result;
  try {
    c = a.toString().split('.')[1].length;
  }
  catch(e) {
    c = 0;
  }
  try {
    d = b.toString().split('.')[1].length;
  }
  catch(e) {
    d = 0;
  }
  e = Math.pow(10, Math.max(c, d));
  result = a * e + b * e;
  result = result / e;
  return result;
}

module.exports = {
  isSet: isSet,
  isEmpty: isEmpty,
  isString: isString,
  isJson: isJson,
  formatTime: formatTime,
  createRandomStr: createRandomStr,
  debugLog: debugLog,
  showError: showError,
  getStrKeyWordArray: getStrKeyWordArray,
  checkSuccess: checkSuccess,
  globalData: globalData,
  clearGlobalData: clearGlobalData,
  config: config,
  status: status,
  clearStatus: clearStatus,
  changePage: changePage,
  encodeURIObj: encodeURIObj,
  showLoading: showLoading,
  hideLoading: hideLoading,
  add: add
}
